package redtankface.tasks;

import redtankface.HitInfo;
import redtankface.RedTankFace;
import redtankface.TankTask;

/**
 * Абстрактная задача, которая живет на выборе удара
 */
abstract public class AbstractHitChooseTask extends TankTask {

	/** Выбранный лучший удра для дальнейшей обработки */
	protected HitInfo mHitInfo = null;

	public AbstractHitChooseTask(RedTankFace aRobot) {
		super(aRobot);
	}

	abstract protected long p_getRating(HitInfo aInfo);

	/** Возвращает макс. количество ударов для анализа */
	abstract protected long getMaxTaskToAnalize();

	/** Возвращает макс. возраст удара для анализа */
	abstract protected long getMaxAgeToAnalize();

	@Override
	public final long getRating() {
		long max_rating = 0;
		mHitInfo = null;
		int counter = 0;
		for (HitInfo info : mRobot.getHists()) {
			long rating = p_getRating(info);
			if (rating > max_rating) {
				max_rating = rating;
				mHitInfo = info;
			}
			if (counter > getMaxTaskToAnalize())
				break;
			if (mRobot.getTime() - info.getTime() > getMaxAgeToAnalize())
				break;
			counter++;
		}

		return max_rating;
	}
}
